// import {hasOwn, isDef} from "../../shared/util";
//
// /**
//  * 是否是真实节点
//  * @param {Node | VNode} node
//  * @return {boolean}
//  */
// export function isRealNode (node) {
//     return hasOwn(node, 'style')
//         && !hasOwn(node, 'elem');
// }
//
// /**
//  * 判断两者是否是同一节点
//  * @param {Node | VNode} one
//  * @param {Node | VNode} other
//  * @return {boolean}
//  */
// export function isSameNode (one, other) {
//     return one.tag === other.tag
//         && one.nodeType === other.nodeType
//         && (hasOwn(one, 'key') && hasOwn(other, 'key'))
//             ? one.key === other.key
//             : true
//         && isRealNode(one);
// }
//
// /**
//  *
//  * @param one
//  * @param other
//  * @return {boolean}
//  */
// export function isSameStruct (one, other) {
//     return false;
// }
//
// /**
//  * 检查真实节点 与 虚拟节点在 class, style 上的不同
//  * @param {HTMLElement} one
//  * @param {VNode} other
//  * @return {boolean}
//  */
// export function needUpdateAttribute (one, other) {
//     return true;
// }
//
// /**
//  * 检查两个虚拟 DOM 节点在 data 属性上的不同
//  * 根据不同的程度判断是否需要重新渲染
//  * @param {VNode} one
//  * @param {VNode} other
//  * @return {boolean}
//  */
// export function needUpdateData (one, other) {
//     // attrs
//     if (one.data.attrs.length !== other.data.attrs.length) {
//         return false;
//     }
//     // on
//     if (one.data.on.length !== other.data.on.length) {
//         return false;
//     }
//     // bindAttrs
//     if (hasOwn(one.data, 'bindAttrs') && hasOwn(other.data, 'bindAttrs')) {
//         if (one.data.bindAttrs.length !== other.data.bindAttrs.length) {
//             return false;
//         }
//     }
//     else if (hasOwn(one.data, 'bindAttrs') || hasOwn(other.data, 'bindAttrs')) {
//         return false;
//     }
//     // bindOn
//     if (hasOwn(one.data, 'bindOn') && hasOwn(other.data, 'bindOn')) {
//         if (one.data.bindOn.length !== other.data.bindOn.length) {
//             return false;
//         }
//     }
//     else if (hasOwn(one.data, 'bindOn') || hasOwn(other.data, 'bindOn')) {
//         return false;
//     }
// }
//
// /**
//  * 获取新旧孩子节点的 key 与 index 的关联
//  * @param {Array<VNode>|HTMLCollection} oldChildren
//  * @param {Array<VNode>|HTMLCollection} newChildren
//  * @param {Number} oldStartIndex
//  * @param {Number} oldFinishIndex
//  * @param {Number} newStartIndex
//  * @param {Number} newFinishIndex
//  * @return {Object}
//  */
// export function keyToIndex (
//     oldChildren,
//     newChildren,
//     oldStartIndex,
//     oldFinishIndex,
//     newStartIndex,
//     newFinishIndex) {
//     let keyToIndexOld = {
//         newIndex: new Map(),
//         oldIndex: new Map(),
//         offset: 0,
//         start: 999999
//     };
//     // 获取新数组的 key => index
//     for (let i=newStartIndex; i<=newFinishIndex; i++) {
//         const key = newChildren[i].key;
//         keyToIndexOld.newIndex.set(key, i);
//     }
//     // 获取旧数组的 key => index
//     for (let i=oldStartIndex; i<=oldFinishIndex; i++) {
//         const key = oldChildren[i].key;
//         keyToIndexOld.oldIndex.set(key, i);
//     }
//     return keyToIndexOld;
// }
